from django.contrib.auth.backends import ModelBackend
import re
from users.models import User


# 让认证的文件直接继承ModelBackend方法,authenticate认证类型中的认证方法
class MeiduoModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 将来用户输入的用户名可能是手机号也可能是用户名,
        # 需要使用user.去判断
        # 方法一:
        # if re.match('^sms_codes/(?P<mobile>1[3-9]\d{9})/$',username):
        #     user = User.objects.get(mobile=username)
        # else:
        #     user = User.objects.get(username=username)
        # 方法二:
        try:
            if re.match('^1[3-9]\d{9}$', username):
                # 判断用户输入的用户名是手机号还是用户名,然后做出判断
                # 如果用户输入的是手机号(判断手机号和用户名)
                user = User.objects.get(mobile=username)

            else:
                # 如果用户输入的是手机号(判断用户名和用户名)
                user = User.objects.get(username=username)

        except:
            # 用户输入的账号和密码都不符合的话,返回none
            return None
        else:
            # 判断出用户输入的用户名和密码之后,核对密码.
            # 密码在数据库中是加密的,加密不可逆,从数据中将密码解密是不可能的
            # 所以需要将客户输入的密码进行加密-使用check(中文查验的意思)方法
            if user.check_password(password):
                return user
            else:
                return None
